/* 
 * File:   MotorColisionesTest.cpp
 * Author: max
 *
 * Created on Nov 5, 2012, 10:22:22 PM
 */

#include <stdlib.h>
#include <iostream>
#include "Reloj.h"
#include "MotorDesplazamiento.h"
#include "MotorColisiones.h"
#include "Partida.h"
#include "Escenario.h"
#include "Pajarito.h"
#include "Cerdito.h"
#include "Vector2D.h"
#include "ActoresConstantes.h"
#include "Caja.h"

using namespace TP::Matematica;
using namespace TP::Juego;
using namespace TP::Juego::Arena::Actores;
using namespace TP::Juego::Arena::Utilidades;
using namespace TP::Juego::Motorizacion;
using namespace TP::Juego::Motorizacion::Sincronizacion;



/*
 * Simple C++ Test Suite
 */

void test1() {
    std::cout << "MotorDesplazamientoTest test 1" << std::endl;
    
    // Configuro un escenario de prueba.
    
    Pajarito* miPajarito = new Pajarito ("pepe");
    
    // En principio hay un pajaro en la posicion (0,0) y se tiene que desplazar a la posicion (5,5).
    Escenario miEscenario (10, 10, "RUTA_IMAGEN");
    
    Posicion* posicion = new Posicion (0,0);
    Vector2D* velocidad = new Vector2D (1,0);
    Vector2D* aceleracion = new Vector2D (0,0);

    miEscenario.addActor (miPajarito, posicion, velocidad, aceleracion);
    
    // Instancio la partida a patir del escenario configurado.
    Partida miPartida (&miEscenario);
    
    // Asocio la partida al motor de desplazamiento.
    MotorDesplazamiento motorDesplazamiento;
    motorDesplazamiento.correrPartida(&miPartida);
    
    // Asocio la partida al motor de colisiones.
    MotorColisiones motorColisiones;
    motorColisiones.correrPartida(&miPartida);
    
    // Instancio un reloj con intervalo de tiempo de 1 tick para temporizar el motor.
    Reloj miReloj (1);
    miReloj.addTemporizable ((ITemporizable*) &motorDesplazamiento);
    miReloj.addTemporizable ((ITemporizable*) &motorColisiones);
    
    // Corre el tiempo...
    for (int cur = 0; cur < 20; cur++)
        miReloj.correr();
    
    // Verifico que las posiciones de los actores en el escenario se hayan desplazado correctamente.
    if ( 0 != miPartida.ArenaJuego()->getActorPorNombre ("pepe")->getTrayectoria()->getPosicion()->X()  ||
         0 != miPartida.ArenaJuego()->getActorPorNombre ("pepe")->getTrayectoria()->getPosicion()->Y()
       )
        std::cout << "%TEST_FAILED% time=0 testname=test1 (MotorDesplazamientoTest) message=Tras correr 20 ticks pepe no esta en la posicion esperada." << std::endl;
}

void test2() {
    std::cout << "MotorColisionesTest test 2" << std::endl;
    std::cout << "%TEST_FAILED% time=0 testname=test2 (MotorColisionesTest) message=error message sample" << std::endl;
}

int main(int argc, char** argv) {
    std::cout << "%SUITE_STARTING% MotorColisionesTest" << std::endl;
    std::cout << "%SUITE_STARTED%" << std::endl;

    std::cout << "%TEST_STARTED% test1 (MotorColisionesTest)" << std::endl;
    test1();
    std::cout << "%TEST_FINISHED% time=0 test1 (MotorColisionesTest)" << std::endl;

    std::cout << "%TEST_STARTED% test2 (MotorColisionesTest)\n" << std::endl;
    test2();
    std::cout << "%TEST_FINISHED% time=0 test2 (MotorColisionesTest)" << std::endl;

    std::cout << "%SUITE_FINISHED% time=0" << std::endl;

    return (EXIT_SUCCESS);
}

